﻿/*
从 1∼n 这 n 个整数中随机选出 m 个，输出所有可能的选择方案。

输入格式
两个整数 n,m,在同一行用空格隔开。

输出格式
按照从小到大的顺序输出所有方案，每行 1 个。

首先，同一行内的数升序排列，相邻两个数用一个空格隔开。

其次，对于两个不同的行，对应下标的数一一比较，字典序较小的排在前面（例如 1 3 5 7 排在 1 3 6 8 前面）。


输入样例：
5 3
输出样例：
1 2 3
1 2 4
1 2 5
1 3 4
1 3 5
1 4 5
2 3 4
2 3 5
2 4 5
3 4 5

*/


#include <iostream>

using namespace std;

int n, m;

void dfs(int u, int sum, int state)
{
    if (sum + n - u < m) return; //把后面的数都选上都达不到m时
    if (sum == m) //如果已经选了 m 个数了，那么就输出
    {
        for (int i = 0; i < n; i++)
            if (state >> i & 1)
                cout << i + 1 << ' ';
        cout << endl;
        return;
    }




    dfs(u + 1, sum + 1, state | 1 << u);
    dfs(u + 1, sum, state);
}

int main()
{
    cin >> n >> m;
    dfs(0, 0, 0);
    //第一个状态表示枚举到第几个数，第二个状态表示当前选了几个数，第三个状态表示当前选哪些个数
    //第三个状态 0 表示没选 1 表示选了
    return 0;
}